/**
 * @file def.h
 * @author BadFatCat0919 (543015378@qq.com)
 * @brief 常量定义
 */

#ifndef __DEF_H__
#define __DEF_H__

const double PI = 3.141592653589793; // 圆周率

const int MAP_X_MAX = 100; // 地图横坐标格数
const int MAP_Y_MAX = 100; // 地图纵坐标格数
const int BENCH_NUM_MAX = 50; // 工作台最大数量
const int ROBOT_NUM_MAX = 4; // 机器人最大数量
const int FRAME_NUM_MAX = 15000; // 最大帧数

const char MAP_TAG_GROUND = '.'; // 空地标签
const char MAP_TAG_OBSTACLE = '#'; // 障碍标签
const char MAP_TAG_PADDING = 'x'; // 扩充障碍标签

const int MAP_EXPAND = 3; // 地图扩充倍数
const int MAP_X_MAX_EXPAND = MAP_X_MAX * MAP_EXPAND; // 扩充后的横坐标格数
const int MAP_Y_MAX_EXPAND = MAP_Y_MAX * MAP_EXPAND; // 扩充后的纵坐标格数

const double MAP_SCALE = 50.0 / MAP_X_MAX / MAP_EXPAND; // 地图一格宽度
const int ROBOT_WIDTH_EMPTY = 3; // 机器人空载时半径占格子数
const int ROBOT_WIDTH_FULL = 4; // 机器人空载时半径占格子数

const double ROBOT_FORWARD_MAX = 6.0; // 机器人最大前进速度
const double ROBOT_FORWARD_MIN = -2.0; // 机器人最小前进速度
const double ROBOT_ROTATE_MAX = PI; // 机器人最大旋转速度

#define BIT(x) (1 << (x)) // 二进制位转十进制数

const int BENCH_MATERIAL[] = { // 工作台所需原材料(首位已补0,直接使用工作台类型映射)
    0, // 补0
    0, // 工作台类型1
    0, // 工作台类型2
    0, // 工作台类型3
    BIT(1) | BIT(2), // 工作台类型4
    BIT(1) | BIT(3), // 工作台类型5
    BIT(2) | BIT(3), // 工作台类型6
    BIT(4) | BIT(5) | BIT(6), // 工作台类型7
    BIT(7), // 工作台类型8
    BIT(1) | BIT(2) | BIT(3) | BIT(4) | BIT(5) | BIT(6) | BIT(7), // 工作台类型9
};

const int BENCH_PRODUCT[] = { // 工作台生产物品类型(首位已补0,直接使用工作台类型映射)
    0, // 补0
    1, // 工作台类型1
    2, // 工作台类型2
    3, // 工作台类型3
    4, // 工作台类型4
    5, // 工作台类型5
    6, // 工作台类型6
    7, // 工作台类型7
    0, // 工作台类型8
    0, // 工作台类型9
};

const double MATERIAL_BUY[] = { // 物品购买价(首位已补0,直接使用物品类型映射)
    0, // 补0
    3000, // 物品类型1
    4400, // 物品类型2
    5800, // 物品类型3
    15400, // 物品类型4
    17200, // 物品类型5
    19200, // 物品类型6
    76000, // 物品类型7
};

const double MATERIAL_SELL[] = { // 物品售价(首位已补0,直接使用物品类型映射)
    0, // 补0
    6000, // 物品类型1
    7600, // 物品类型2
    9200, // 物品类型3
    22500, // 物品类型4
    25000, // 物品类型5
    27500, // 物品类型6
    105000, // 物品类型7
};

const double MATERIAL_EARNING[] = { // 出售物品理想获利(首位已补0,直接使用物品类型映射)
    0, // 补0
    MATERIAL_SELL[1] - MATERIAL_BUY[1], // 物品类型1
    MATERIAL_SELL[2] - MATERIAL_BUY[2], // 物品类型2
    MATERIAL_SELL[3] - MATERIAL_BUY[3], // 物品类型3
    MATERIAL_SELL[4] - MATERIAL_BUY[4], // 物品类型4
    MATERIAL_SELL[5] - MATERIAL_BUY[5], // 物品类型5
    MATERIAL_SELL[6] - MATERIAL_BUY[6], // 物品类型6
    MATERIAL_SELL[7] - MATERIAL_BUY[7], // 物品类型7
};

#endif // __DEF_H__
